package com.smh.demo1.a09;

import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Lazy;

/**
 * @author shiminghui
 * @date 2025/4/12 13:59
 * @description: TODO
 */
public class E {

    @Autowired
    @Lazy
    private B1 b1;

    @Autowired
    private B2 b2;

    @Autowired
    private ObjectFactory<B3> b3Factory;

    @Autowired
    private ApplicationContext context;


    // 虽然 b1 和 b2 都是 prototype 类型的，但是由于E是 singleton 类型，所以依赖注入只执行了一次，所以b1和b2都是同一个对象
    // 解决,就是注入一个代理对象,通过代理对象调用方法,代理对象会检查是否是 prototype 类型的,如果是,就创建一个新的对象,否则就返回原来的对象
    public B1 getB1() {
        return b1;
    }

    public B2 getB2() {
        return b2;
    }

    public B3 getB3() {
        return b3Factory.getObject();
    }

    public B4 getB4() {
        return context.getBean(B4.class);
    }
}
